package com.yunxin.core.infra.persistence.mapper.product;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.yunxin.core.domain.external.product.ProductBanDetails;
import com.yunxin.core.domain.model.product.ProductInfo;
import com.yunxin.core.dto.ApiConfigWecom;
import com.yunxin.core.infra.persistence.entity.page.query.result.ProductPriceInfoResult;
import com.yunxin.core.infra.persistence.entity.product.ProductInfoDO;
import com.yunxin.core.infra.persistence.entity.product.query.condition.ProductMorePageCondition;
import com.yunxin.core.infra.persistence.entity.product.query.condition.ProductPageCondition;
import com.yunxin.core.infra.persistence.entity.product.query.result.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @author zero°
 * @since 2023-05-25
 */
@DS("core")
@Mapper
public interface ProductInfoExtendMapper extends ProductInfoMapper {

    /**
     * 商户下架产品
     * @param merchantId merchantId
     * @param editor editor
     * @return int
     */
    int offShelfMerchantProduct(@Param("merchantId") Long merchantId, @Param("editor") String editor);

    /**
     * 根据商户id及产品名称查询产品信息
     * @param merchantId merchantId
     * @param productName productName
     * @return ProductInfo
     */
    Long selectProductIdByMerchantIdAndProductName(@Param("merchantId") Long merchantId, @Param("productName") String productName);

    /**
     * 根据产品id查询产品推广信息
     * @param productId productId
     * @return ProductPromotionInfoResult
     */
    ProductPromotionInfoResult selectByProductId(@Param("productId") Long productId);

    /**
     * 根据产品id查询产品详情
     * @param productId productId
     * @return ProductDetailResult
     */
    ProductDetailResult selectProductDetailByProductId(@Param("productId") Long productId);
    /**
     * 根据产品id查询产品详情(C端)
     * @param productId productId
     * @return ProductInfoResult
     */
    ProductInfoResult selectProductInfoResultByProductId(@Param("productId") Long productId);

    /**
     * 获取分配产品详情(C端-产品必须已上架且单价配置计费方式为表单的数据)
     * @return List<ProductAllocationDetailResult>
     */
    List<ProductAllocationDetailResult> listProductAllocationDetailResult();

    /**
     * 根据商户id查询产品推广详情
     * @param merchantId merchantId
     * @param productType productType
     * @return List<ProductDetailResult>
     */
    List<ProductDetailResult> listProductDetailByMerchantId(@Param("merchantId") Long merchantId, @Param("productType") Integer productType);

    /**
     * 分页查询产品列表总条数
     * @param condition condition
     * @return count
     */
    long countProductPageQuery(ProductPageCondition condition);

    /**
     * 分页查询产品列表
     * @param condition condition
     * @return List<ProductPageResult>
     */
    List<ProductPageResult> productPageQuery(ProductPageCondition condition);

    /**
     * 获取产品下拉列表-已上架
     * @return List<ProductInfo>
     */
    List<ProductInfoDO> listProduct();

    /**
     * 根据产品id集合获取产品
     * @param ids ids
     * @return List<ProductInfo>
     */
    List<ProductInfoDO> listProductByIds(@Param("ids") Set<Long> ids);

    /**
     * 根据产品id查询页面元素产品信息
     * @param ids ids
     * @return List<ProductFromPageElementResult>
     */
    List<ProductFromPageElementResult> listProductFromPageElementByIds(@Param("ids") Set<Long> ids);

    /**
     * 根据产品id查询产品配置保存结果
     * @param productId productId
     * @return ProductSaveResult
     */
    ProductSaveResult getProductSaveResult(@Param("productId") Long productId);

    /**
     * 分页查询更多产品列表总条数
     * @param condition condition
     * @return count
     */
    long countMoreProductPage(ProductMorePageCondition condition);

    /**
     * 分页查询更多产品列表(不联登的)
     * @param condition condition
     * @return List<ProductMoreSimpleInfoResult>
     */
    List<ProductMoreSimpleInfoResult> moreProductPage(ProductMorePageCondition condition);

    /**
     * 根据产品id查询产品价格信息
     * @param productId productId
     * @return ProductPriceInfoResult
     */
    ProductPriceInfoResult selectProductPriceInfoByProductId(@Param("productId") Long productId);

    /**
     * 查询条件产品
     * @param productStatus product_status
     * @param abutmentType abutmentType
     * @param chargedWayList chargedWay
     * @return List<ProductInfoDO>
     */
    List<ProductInfoDO> selectProductOptionList(@Param("productStatus")Integer productStatus,
                                                @Param("abutmentType") Integer abutmentType,
                                                @Param("chargedWayList") List<Integer>  chargedWayList);


    /**
     * 根据产品id查询弹窗产品信息
     * @param productIds productIds
     * @return List<ProductDetailFromPopupResult>
     */
    List<ProductDetailFromPopupResult> listProductDetailsByIds(@Param("ids") List<Long> productIds);

    /**
     * 获取商户下面的所以产品
     * @param merchantId
     */
    List<ProductInfoDO> listProductByMerchantId(@Param("merchantId") Long merchantId);

    /**
     * 更新产品禁止状态
     * @param dto
     * @return
     */
    int updateProductProhibitStatus(@Param("dto")ProductInfo dto);

    List<ProductDetailResult> listAllProductByMerchantId(@Param("merchantId") Long merchantId, @Param("productType") Integer productType);

    List<ProductInfoDO> listProductNAbutment();

    /**
     * 根据产品id获取企微配置信息
     * @param productId
     * @return
     */
    ApiConfigWecom getWeComApiConfig(@Param("productId") Long productId);

    List<ProductInfoDO> listProductByMerchantIdAndUserId(@Param("merchantId") Long merchantId);

    /**
     * 获取所有上架的uv联登产品详情
     * @return
     */
    List<ProductAllocationDetailResult> listUvProductDetailResult();

    List<ProductMoreSimpleInfoResult> loginProduct(ProductMorePageCondition condition);

    long countMoreUvProductPage(ProductMorePageCondition condition);

    ProductAllocationDetailResult selectAllocationDetailById(@Param("productId") Long productId);

    List<ProductInfoResult> selectProductInfoResultByProductIds(@Param("productIds") List<Long> productIds);

    List<ProductAllocationDetailResult> selectByDetailResultsMerchantId(@Param("merchantId") Long merchantId);

    List<ProductInfoDO> allProducts();

    /**
     * 查询产品禁用列表
     * @param productBanDetails
     * @return
     */
    List<ProductInfoDO> getAListOfBannedProducts(ProductBanDetails productBanDetails);
}
